#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import json


class Carta:
	def __init__(self, num, nome, era, colore):
		self.num = num # numero
		self.nome = nome[:32] # max 32 caratteri
		self.era = era
		self.colore = colore
		self.costo = dict(legno=0, pietra=0, argilla=0, oro=0, stoffa=0, vetro=0, papiri=0, monete=0)
		self.produzione = dict(legno=0, pietra=0, argilla=0, oro=0, stoffa=0, vetro=0, papiri=0, monete=0)
		self.azione_istantanea = None
		self.azione_finale = None
		self.num_giocatori = 3
		self.gioca_gratis = None
		self.succ = None
	
	def setGiocaGratis(self, gioca_gratis):
		self.gioca_gratis = gioca_gratis # numero
	
	def setGiocatori(self, giocatori):
		self.giocatori = giocatori # numero
	
	def setSucc(self, succ):
		self.succ = succ # numero
			
	def setCosto(self, costo):
		self.costo.update(costo)
	
	def setProduzione(self, produzione):
		self.produzione.update(produzione)
	
	def setAzioneIstantanea(self, azione_istantanea):
		self.azione_istantanea = azione_istantanea
	
	def setAzioneFinale(self, azione_finale):
		self.azione_finale = azione_finale
	
	def isRisorsa(self):
		return sum(self.produzione.values()) > 0
	
	def isRisorsaMultipla(self):
		return sum([x>0 for x in self.produzione.values()]) > 1
	
	def isCommerciabile(self):
		if not self.isRisorsa() or self.colore == "giallo" or sum([x>0 for x in self.produzione.values()]) > 2:
			return False
		else:
			return True

	def generaCodice(self):
		codice = ""
		codice += "carta carta%d = {\n" % self.num
		codice += "\t.num = %d,\n" % self.num
		codice += "\t.risorsa = %d,\n" % self.isRisorsa()
		codice += "\t.nome =  \"%s\",\n" % self.nome
		codice += "\t.era = %d,\n" % self.era
		codice += "\t.colore = %s,\n" % self.colore.upper()
		codice += "\t.gioca_gratis = NULL,\n"
		codice += "\t.costo[LEGNO] = %d,\n" % self.costo["legno"]
		codice += "\t.costo[PIETRA] = %d,\n" % self.costo["pietra"]
		codice += "\t.costo[ARGILLA] = %d,\n" % self.costo["argilla"]
		codice += "\t.costo[ORO] = %d,\n" % self.costo["oro"]
		codice += "\t.costo[STOFFA] = %d,\n" % self.costo["stoffa"]
		codice += "\t.costo[VETRO] = %d,\n" % self.costo["vetro"]
		codice += "\t.costo[PAPIRI] = %d,\n" % self.costo["papiri"]
		codice += "\t.costo[MONETE] = %d,\n" % self.costo["monete"]
		codice += "\t.produzione[LEGNO] = %d,\n" % self.produzione["legno"]
		codice += "\t.produzione[PIETRA] = %d,\n" % self.produzione["pietra"]
		codice += "\t.produzione[ARGILLA] = %d,\n" % self.produzione["argilla"]
		codice += "\t.produzione[ORO] = %d,\n" % self.produzione["oro"]
		codice += "\t.produzione[STOFFA] = %d,\n" % self.produzione["stoffa"]
		codice += "\t.produzione[VETRO] = %d,\n" % self.produzione["vetro"]
		codice += "\t.produzione[PAPIRI] = %d,\n" % self.produzione["papiri"]
		codice += "\t.produzione[MONETE] = %d,\n" % self.produzione["monete"]
		codice += "\t.multipla = %d,\n" % self.isRisorsaMultipla()
		codice += "\t.commerciabile = %d,\n" % self.isCommerciabile()
		if self.azione_istantanea != None:
			codice += "\t.azione_istantanea = %s,\n" % self.azione_istantanea
		else:
			codice += "\t.azione_istantanea = non_fare_nulla,\n"
		if self.azione_finale != None:
			codice += "\t.azione_finale = %s,\n" % self.azione_finale
		else:
			codice += "\t.azione_finale = non_fare_nulla,\n"
		codice += "\t.succ = NULL\n"
		codice += "};\n"
		return codice
	
	def generaCodicePuntatori(self):
		codice = ""
		if self.gioca_gratis != None:
			codice += "\tcarta%d.gioca_gratis = &carta%d;\n" % (self.num, self.gioca_gratis)
		if self.succ != None:
			codice += "\tcarta%d.succ = &carta%d;\n" % (self.num, self.succ)
		else:
			codice += "\tcarta%d.succ = NULL;\n" % self.num
		return codice

def cercaNumCarta(data, nome_carta):
	for era in (1,2,3):
		for carta in data["era%d" % era]:
			if carta["nome"] == nome_carta:
				return carta["num"]
	for nome_meraviglia in data["meraviglie"].keys():
		for carta in data["meraviglie"][nome_meraviglia]:
			if carta["nome"] == nome_carta:
				return carta["num"]
	raise Exception("Carta non trovata")


json_file = open('mazzo.json')
json_data = json_file.read() #.lower()
json_file.close()
data = json.loads(json_data)

# Assegna un numero a ciascuna carta
num = 100
for era in (1,2,3):
	precedente = None
	for carta in data["era%d" % era]:
		num += 1
		carta["num"] = num
		if precedente != None:
			precedente["succ"] = num
		precedente = carta

for nome_meraviglia in data["meraviglie"].keys():
	precedente = None
	for carta in data["meraviglie"][nome_meraviglia]:
		num += 1
		carta["num"] = num
		if precedente != None:
			precedente["succ"] = num
		precedente = carta

# Leggi il mazzo e genera il codice
definizione_era = ""
puntatori_era = dict()

for era in (1,2,3):
	definizione_era += "\n/* ===== ERA %d ===== */\n" % era
	puntatori_era["era%d" % era] = ""
	carta_precedente = None
	for carta in data["era%d" % era]:
		struct = Carta(carta["num"], carta["nome"], era, carta["colore"])
		
		if "costo" in carta:
			struct.setCosto(carta["costo"])
		if "produzione" in carta:
			struct.setProduzione(carta["produzione"])
		if "gioca_gratis" in carta:
			struct.setGiocaGratis(cercaNumCarta(data, carta["gioca_gratis"]))
		if "azione_istantanea" in carta:
			struct.setAzioneIstantanea(carta["azione_istantanea"])
		if "azione_finale" in carta:
			struct.setAzioneFinale(carta["azione_finale"])
		if "giocatori" in carta:
			struct.setGiocatori(carta["giocatori"])
		if "succ" in carta:
			struct.setSucc(carta["succ"])
		
		definizione_era += struct.generaCodice()
		puntatori_era["era%d" % era] += struct.generaCodicePuntatori()
		succ = carta["num"]

# Stampa il codice
print "/* NON MODIFICARE DIRETTAMENTE QUESTO FILE, LE MODIFICHE ANDRANNO PERSE! */"

print definizione_era
for era in (1,2,3):
	print "carta* mazzo_era%d(){" % era
	print puntatori_era["era%d" % era]
	if len(data["era%d" % era]) > 1:
		print "\treturn &carta%d;" % data["era%d" % era][0]["num"]
	else: 
		print "\treturn NULL;"
	print "}"
	
definizione_meraviglia = ""
puntatori_meraviglia = dict()

for nome_meraviglia in data["meraviglie"].keys():
	definizione_meraviglia += "\n/* === %s === */\n" % nome_meraviglia.upper()
	puntatori_meraviglia[nome_meraviglia] = ""
	for carta in data["meraviglie"][nome_meraviglia]:
		struct = Carta(carta["num"], carta["nome"], 1, "trasparente")
	
		if "costo" in carta:
			struct.setCosto(carta["costo"])
		if "produzione" in carta:
			struct.setProduzione(carta["produzione"])
		if "colore" in carta:
			raise Exception("La meraviglia non deve avere 'colore'")
		if "gioca_gratis" in carta:
			raise Exception("La meraviglia non deve avere 'gioca_gratis'")
		if "azione_istantanea" in carta:
			struct.setAzioneIstantanea(carta["azione_istantanea"])
		if "azione_finale" in carta:
			struct.setAzioneFinale(carta["azione_finale"])
		if "giocatori" in carta:
			raise Exception("La meraviglia non deve avere 'giocatori'")
		if "succ" in carta:
			struct.setSucc(carta["succ"])
		
		definizione_meraviglia += struct.generaCodice()
		puntatori_meraviglia[nome_meraviglia] += struct.generaCodicePuntatori()

# Stampa il codice
print "\n/* ===== MERAVIGLIE ===== */"
print definizione_meraviglia
for nome_meraviglia in puntatori_meraviglia.keys():
	print "carta* mazzo_%s(){" % nome_meraviglia
	print puntatori_meraviglia[nome_meraviglia]
	if len(data["meraviglie"][nome_meraviglia]) > 1:
		print "\treturn &carta%d;" % data["meraviglie"][nome_meraviglia][0]["num"]
	else: 
		print "\treturn NULL;"
	print "}"

